package com.ruoyi.web.controller.tool.designpattern.behavioralPatterns.command;

/**
 * 命令模式
 *
 * @author Hack2003
 * @date 2024/3/20 16:38
 **/
// 命令接口
interface Command {
    void execute();
}

// 具体命令
class ConcreteCommand implements Command {
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }
    @Override
    public void execute() {
        //接收者执行命令
        receiver.action();
    }
}

// 接收者
class Receiver {
    public void action() {
        System.out.println("接收者正在执行操作.");
    }
}

// 调用者
class Invoker {
    private Command command;

    public Invoker(Command command) {
        this.command = command;
    }

    //调用者下达命令
    public void executeCommand() {
        command.execute();
    }
}

/**
 * 命令模式有助于实现请求的发送者和接收者解耦，
 * 支持命令的排队、记录和撤销等操作。这种模式通常用于实现日志系统、事务处理、菜单命令等。
 */
public class Test {
    public static void main(String[] args) {
        //命令接收者
        Receiver receiver = new Receiver();
        //制作命令，让命令接收者执行命令
        Command command = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker(command);
        //命令执行
        invoker.executeCommand();
    }
}